package de.fhtrier.gdw2.ships.game.entities;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.state.StateBasedGame;

import de.fhtrier.gdw2.ships.game.Constants;
import de.fhtrier.gdw2.ships.game.World;
import de.fhtrier.gdw2.ships.game.interfaces.ISelecteable;
import de.fhtrier.gdw2.ships.game.modules.Module;

public class Unit extends Entity implements ISelecteable
	{
//Konstruktoren
		public Unit(int direction, double d, double e, Image i)
			{
				super(direction, d, e, i);
			}

		public Unit(Unit u)
			{
				super(u.getDirection(), u.getX(), u.getY(), u.getPic());
				for (Module m : u.getModules())
					{
						addModule(m);
					}
			}
//update Unit
		@Override
		public void update(World w, GameContainer container, int delta)
			{

				for (Module m : modules)
					{
						m.update(w, container, delta, this);
					}

			}
//render Unit
		@Override
		public void render(GameContainer container, StateBasedGame game,
				Graphics g)
			{

				// -------------------------
				int halfsize = 70; // Größe des Schutzschildes bisher hardcoded
				int halfCompSize = Constants.COMPONENTSIZE / 2;
				// ----------------------------------
				g.pushTransform();
				// Entity gemäß direction um Mitte rotieren...
				g.rotate((float)getX()+ Constants.COMPONENTSIZE/2, (float)getY()+ Constants.COMPONENTSIZE/2, getDirection());

				// Entity gemäß position verschieben (und zentriert rendern)
				g.translate((float)getX(), (float)getY());

				//getPic().draw(); // Schild.draw
													// grafik-zentriert
				for (Module m : getModules()) // Module rendern
					{
						m.render(container, game, g);
					}				
				g.popTransform();
				g.drawString("X: " + this.getX() + " Y: " + this.getY(), (float)this.getX() +2*Constants.COMPONENTSIZE,(float)this.getY() +2*Constants.COMPONENTSIZE);
				
			}
		
//right-click-order for this unit
		@Override
		public void rightClickOrder(World w, float x, float y)
			{
				Target myTarget;
				// Gibt es Ein Entity an der Position X/Y?
				ISelecteable e = w.getEntityAtPosition(x, y);

				if (e != null)
					{
						myTarget = new Target(e.getX(), e.getY());
					} else
					{
						myTarget = new Target(x, y);
					}
				setTarget(myTarget);
				w.addEntity(myTarget);
			}


		/**
		 * 
		 * Liefert ein Duplikat des Aufrufers
		 * 
		 * @author Wendelin
		 * @return Entity Duplikat   
		 */
		public Entity duplicate()
			{
				return duplicateUnit();
			}


		/**
		 * 
		 * Liefert ein Duplikat des Aufrufers
		 * 
		 * @author Wendelin
		 * @return Unit Duplikat
		 */
		public Unit duplicateUnit()
			{
				Unit newUnit;
				newUnit = new Unit(getDirection(), getX(), getY(), getPic()
						.getScaledCopy(1));
				newUnit.addModuleDuplicates(this);
				return newUnit;
			}

		/**
		 * 
		 * fügt dem Aufrufer Duplikate der Module des übergeben Units hinzu.
		 * 
		 * @author
		 * @param
		 */
		private void addModuleDuplicates(Unit u)
			{
				for (Module m : u.getModules())
					{
						this.addModule(m.duplicateModule());
					}

			}
//Getter und Setter
		public String getTypeName()
			{
				return super.getTypeName();
			}

		@Override
		public void setTarget(Target myTarget)
			{
				super.setTarget(myTarget);

			}

		/**
		 * 
		 * Bewegt das Entity um x, y Pixel auf der x, y Achse
		 * @author
		 * @param
		 */
		public void move(double f, double g) {
			this.setX(this.getX() + f);
			this.setY(this.getY() + g);
		}
		
		public void setDirection(int theta)
			{
				super.setDirection(theta);
				
			}


	}
